Call REST API from ASP.NET Core Blazor
In this video we will discuss how to call and consume a REST API from ASP.NET Core Blazor application.
Can a Blazor component call REST API directly
Yes, a Blazor component can directly call a REST API. However, for separation of concerns and to keep the component code clean, it's a good practice to create a separate service that calls the REST API.
Create a service to call REST API
Add a folder with name Services to the Blazor web application project. Add the following 2 class files to this folder.
- IEmployeeService.cs
- EmployeeService.cs
IEmployeeService.cs
public interface IEmployeeService
{
    Task<IEnumerable<Employee>> GetEmployees();
}EmployeeService.cs
- We are using HttpClient class to call the REST API service.
- This class is in System.Net.Http namespace.
- HttpClient is injected into the EmployeeService using dependency injection.
- We have not registered HttpClient service with the dependency injection container yet. We will do that in just a bit.
- We are using httpClient.GetJsonAsync to call the REST API. This method is in Microsoft.AspNetCore.Blazor.HttpClient Nuget package. Install this package and do not forget to include the namespace Microsoft.AspNetCore.Components.
- Pass the REST API endpoint (api/employees) to httpClient.GetJsonAsync method.
 httpClient.GetJsonAsync<Employee[]>("api/employees")
using EmployeeManagement.Models;
using Microsoft.AspNetCore.Components;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;
namespace EmployeeManagement.Web.Services
{
    public class EmployeeService : IEmployeeService
    {
        private readonly HttpClient httpClient;
        public EmployeeService(HttpClient httpClient)
        {
            this.httpClient = httpClient;
        }
        public async Task<IEnumerable<Employee>> GetEmployees()
        {
            return await httpClient.GetJsonAsync<Employee[]>("api/employees");
        }
    }
}Register HttpClient Services
In ConfigureServices method of the Startup class register HttpClient Services using AddHttpClient method.
public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();
    services.AddServerSideBlazor();
    services.AddHttpClient<IEmployeeService, EmployeeService>(client =>
    {
        client.BaseAddress = new Uri("https://localhost:44379/");
    });
}Call Service from Blazor Component
- Finally call IEmployeeService from EmployeeList blazor component.
- We use [Inject] attribute to inject a service into a Blazor component. We cannot use a constructor for this.
- In the component OnInitializedAsync method, we call the EmployeeService.GetEmployees method.
- The data (list of employees) that this method returns is then used to initialise Employees property.
- The EmployeeList blazor component binds to this Employees property to display the list of employees.
using EmployeeManagement.Models;
using EmployeeManagement.Web.Services;
using Microsoft.AspNetCore.Components;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace EmployeeManagement.Web.Pages
{
    public class EmployeeListBase : ComponentBase
    {
        [Inject]
        public IEmployeeService EmployeeService { get; set; }
        public IEnumerable<Employee> Employees { get; set; }
        protected override async Task OnInitializedAsync()
        {
            Employees = (await EmployeeService.GetEmployees()).ToList();
        }
    }
}© 2020 Pragimtech. All Rights Reserved.

